<?php
/**
 * 轻舟CMS(QZLOG)
 *
 * 一款基于PHP+MYSQL的开源内容管理系统，模板标签简单、可扩展性强，利于二次开发，轻松建站的首选利器。
 *
 * @package     QZLOG
 * @license     http://www.qzlog.com/license
 * @link        http://www.qzlog.com
 * @mail        info@shyohan.com
 * @since       Version 3.0
 * @copyright   Copyright (c) 2015 - 2017 上海优翰信息科技有限公司. All rights reserved.
 */

defined('IN_QZLOG') OR exit('QZLOG:No direct script access allowed!');

/**
 * 模型管理模型
 * @author LINK <link@shyohan.com>
 */
class AttributeModel extends ViewModel
{
    public $table = "attribute";
    /* 操作的表名 */
    protected $table_name = null;

    /* 自动验证规则 */
    public $validate = array(
        array('name', 'nonull', '字段名不能为空 ', 3, 3),
        array('name', 'checkName', '字段名已经存在 ', 2, 3),
        array('name', 'regexp:/^[a-zA-Z][\w_]{1,29}$/', '字段名不合法', 1, 3),
        array('field', 'nonull', '字段定义不能为空 ', 3, 3),
        array('model_id', 'nonull', '未选择操作的模型 ', 3, 3),
    );

    /**
     * 检查同一张表是否有相同的字段
     * @author @author LINK <link@shyohan.com>
     */
    public function checkName($name, $value, $msg, $arg)
    {
        $model_id = Q('model_id');
        $id = Q('id');
        $map = array('name' => $value, 'model_id' => $model_id);
        if (!empty($id)) {
            $map['id'] = array('neq', $id);
        }
        $res = $this->where($map)->find();
        if ($res) {
            return $msg;
        } else {
            return true;
        }
    }

    /**
     * 新增或更新一个属性
     * @return boolean fasle 失败 ， int  成功 返回完整的数据
     * @author @author LINK <link@shyohan.com>
     */
    public function addAttribute()
    {
        if ($this->create()) {
            $data = $this->data;
            $id = $this->add($data);
            if (!$id) {
                $this->error = '新增属性出错,请检查！';
                return false;
            }

            //新增表字段
            $res = $this->addField($data);
            if (!$res) {
                $this->error = '新建字段出错,请检查！';
                //删除新增数据
                $this->delete($id);
                return false;
            }
            //删除字段缓存文件

            //内容添加或更新完成
            return true;
        }
    }

    /**
     * 新增或更新一个属性
     * @return boolean fasle 失败 ， int  成功 返回完整的数据
     * @author @author LINK <link@shyohan.com>
     */
    public function editAttribute($data = array())
    {
        if (!$this->create()) {
            return false;
        }

        $data = empty($data) ? $this->data :$data;

        //更新表字段
        $res = $this->updateField($data);
        if (!$res) {
            $this->error = '更新字段出错！';
            return false;
        }

        $status = $this->save($data);
        if (false === $status) {
            $this->error = '更新属性出错！';
            return false;
        }
        //删除字段缓存文件

        //内容添加或更新完成
        return true;
    }

    /**
     * 删除
     * @author LINK <link@shyohan.com>
     * @return bool
     */
    public function delAttribute()
    {
        $id = Q("id", 0);
        if (!$id) {
            $this->error = '参数错误!';
            return false;
        }
        $info = $this->find($id);
        if (empty($info) || !$info) {
            $this->error = '该字段不存在！';
            return false;
        }

        //删除属性数据
        $res = $this->del($id);

        //删除表字段
        $res2 = $this->deleteField($info);

        if ($res && $res2) {
            return true;
        } else {
            $this->error = '删除失败';
        }
    }

    /**
     * 检查当前表是否存在
     * @param intger $model_id 模型id
     * @return intger 是否存在
     * @author LINK <link@shyohan.com>
     */
    protected function checkTableExist($model_id)
    {
        $Model = M('Model');
        //当前操作的表
        $model = $Model->where(array('id' => $model_id))->field('name,extend')->find();

        if ($model['extend'] == 0) {    //独立模型表名
            $table_name = $this->table_name = strtolower($model['name']);
        } else {                        //继承模型表名
            $extend_model = $Model->where(array('id' => $model['extend']))->field('name,extend')->find();
            $table_name = $this->table_name = strtolower($extend_model['name']) . '_' . strtolower($model['name']);
        }

        $res = M()->tableExists($table_name);
        return $res;
    }

    /**
     * 新建表字段
     * @param array $field 需要新建的字段属性
     * @return boolean true 成功 ， false 失败
     * @author LINK <link@shyohan.com>
     */
    protected function addField($field)
    {
        //检查表是否存在
        $table_exist = $this->checkTableExist($field['model_id']);

        //获取默认值
        if ($field['value'] === '') {
            $default = '';
        } elseif (is_numeric($field['value'])) {
            $default = ' DEFAULT ' . $field['value'];
        } elseif (is_string($field['value'])) {
            $default = ' DEFAULT \'' . $field['value'] . '\'';
        } else {
            $default = '';
        }
        $table = C('DB_PREFIX') . $this->table_name;
        if ($table_exist) {
            $sql = <<<sql
				ALTER TABLE `{$table}`
ADD COLUMN `{$field['name']}`  {$field['field']} {$default} COMMENT '{$field['title']}';
sql;
        } else {
            //新建表时是否默认新增“id主键”字段
            $model_info = M('Model')->field('engine_type,need_pk')->find($field['model_id']);
            if ($model_info['need_pk']) {
                $sql = <<<sql
				CREATE TABLE IF NOT EXISTS `{$table}` (
				`id`  int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键' ,
				`{$field['name']}`  {$field['field']} {$default} COMMENT '{$field['title']}' ,
				PRIMARY KEY (`id`)
				)
				ENGINE={$model_info['engine_type']}
				DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
				CHECKSUM=0
				ROW_FORMAT=DYNAMIC
				DELAY_KEY_WRITE=0
				;
sql;
            } else {
                $sql = <<<sql
				CREATE TABLE IF NOT EXISTS `{$table}` (
				`{$field['name']}`  {$field['field']} {$default} COMMENT '{$field['title']}'
				)
				ENGINE={$model_info['engine_type']}
				DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
				CHECKSUM=0
				ROW_FORMAT=DYNAMIC
				DELAY_KEY_WRITE=0
				;
sql;
            }

        }
        $res = M()->exe($sql);
        return $res !== false;
    }

    /**
     * 更新表字段
     * @param array $field 需要更新的字段属性
     * @return boolean true 成功 ， false 失败
     * @author LINK <link@shyohan.com>
     */
    protected function updateField($field)
    {

        $table_exist = $this->checkTableExist($field['model_id']); //检查表是否存在
        //获取原字段名数据（一维数组）
        $last_field = $this->where(array('id' => $field['id']))->getField('name');

        //获取默认值
        $default = $field['value'] != '' ? ' DEFAULT ' . $field['value'] : '';
        $table = C('DB_PREFIX') . $this->table_name;
        $sql = <<<sql
			ALTER TABLE `{$table}`
CHANGE COLUMN `{$last_field}` `{$field['name']}`  {$field['field']} {$default} COMMENT '{$field['title']}' ;
sql;
        $res = M()->exe($sql);
        return $res !== false;
    }

    /**
     * 删除一个字段
     * @param array $field 需要删除的字段属性
     * @return boolean true 成功 ， false 失败
     * @author LINK <link@shyohan.com>
     */
    public function deleteField($field)
    {
        $this->checkTableExist($field['model_id']); //检查表是否存在
        $table = C('DB_PREFIX') . $this->table_name;
        $sql = <<<sql
			ALTER TABLE `{$table}`
DROP COLUMN `{$field['name']}`;
sql;
        $res = M()->exe($sql);
        return $res !== false;
    }


}